package com.szgz.platform.util;

import lombok.extern.slf4j.Slf4j;

/**
 * 内存值解析工具类
 * 支持解析带单位的内存值，如：512m, 1g, 2gb, 1024kb等
 */
@Slf4j
public class MemoryParser {

    /**
     * 将带单位的内存值转换为字节数
     * @param memoryValue 内存值，如：512m, 1g, 2gb, 1024kb等
     * @return 字节数
     * @throws IllegalArgumentException 如果格式不正确
     */
    public static long parseToBytes(String memoryValue) {
        if (memoryValue == null || memoryValue.trim().isEmpty()) {
            throw new IllegalArgumentException("内存值不能为空");
        }

        String value = memoryValue.trim().toLowerCase();
        
        try {
            // 如果没有单位，假设是字节
            if (value.matches("^\\d+$")) {
                return Long.parseLong(value);
            }
            
            // 处理带单位的值
            if (value.endsWith("b")) {
                // 字节
                if (value.matches("^\\d+b$")) {
                    return Long.parseLong(value.substring(0, value.length() - 1));
                }
                // kb, mb, gb, tb
                if (value.matches("^\\d+kb$")) {
                    return Long.parseLong(value.substring(0, value.length() - 2)) * 1024L;
                }
                if (value.matches("^\\d+mb$")) {
                    return Long.parseLong(value.substring(0, value.length() - 2)) * 1024L * 1024L;
                }
                if (value.matches("^\\d+gb$")) {
                    return Long.parseLong(value.substring(0, value.length() - 2)) * 1024L * 1024L * 1024L;
                }
                if (value.matches("^\\d+tb$")) {
                    return Long.parseLong(value.substring(0, value.length() - 2)) * 1024L * 1024L * 1024L * 1024L;
                }
            }
            
            // 处理不带b的简写单位：k, m, g, t
            if (value.matches("^\\d+k$")) {
                return Long.parseLong(value.substring(0, value.length() - 1)) * 1024L;
            }
            if (value.matches("^\\d+m$")) {
                return Long.parseLong(value.substring(0, value.length() - 1)) * 1024L * 1024L;
            }
            if (value.matches("^\\d+g$")) {
                return Long.parseLong(value.substring(0, value.length() - 1)) * 1024L * 1024L * 1024L;
            }
            if (value.matches("^\\d+t$")) {
                return Long.parseLong(value.substring(0, value.length() - 1)) * 1024L * 1024L * 1024L * 1024L;
            }
            
            throw new IllegalArgumentException("不支持的内存值格式: " + memoryValue);
            
        } catch (NumberFormatException e) {
            throw new IllegalArgumentException("无法解析内存值: " + memoryValue, e);
        }
    }

    /**
     * 将字节数转换为人类可读的格式
     * @param bytes 字节数
     * @return 人类可读的格式，如：512MB, 1GB等
     */
    public static String formatBytes(long bytes) {
        if (bytes < 1024) {
            return bytes + "B";
        }
        if (bytes < 1024 * 1024) {
            return String.format("%.1fKB", bytes / 1024.0);
        }
        if (bytes < 1024 * 1024 * 1024) {
            return String.format("%.1fMB", bytes / (1024.0 * 1024.0));
        }
        if (bytes < 1024L * 1024 * 1024 * 1024) {
            return String.format("%.1fGB", bytes / (1024.0 * 1024.0 * 1024.0));
        }
        return String.format("%.1fTB", bytes / (1024.0 * 1024.0 * 1024.0 * 1024.0));
    }
} 